package com.cskaoyan.javase.basic._4extend;

/**
 * 基本数据类型的类型转换
 * 数据类型的转换又可以分为两类：
 *      1.自动类型转换
 *          编译器帮助我们完成类型转换，这意味着我们程序员不需要写额外代码，就可以自动完成类型转换。
 *
 *      2.强制类型转换
 *          编译器不会自动完成类型转换，而是需要程序员手动写代码完成类型转换。
 *          需要强转的特殊语法、
 *
 * 基本数据类型的自动类型转换：
 *      条件是：取值范围从小的到大的
 *      问题：基本数据类型的自动类型转换是一定安全的吗？是一定能够确保数据准确的吗？
 *      并不是一定的，少数情况下可能出现数据失真。
 *      当整型 --> 浮点型时可能产生问题
 *
 * 基本数据类型的强制类型转换：
 *      条件是：取值范围从大的到小的
 *      特殊语法:
 *         要强转成的数据类型 变量名 = (要强转成的数据类型)要强转的变量名;
 *
 * 扩展:
 *      1.既然基本数据类型存在类型转换,那么引用数据类型同样可以进行类型转换
 *      2.引用数据类型的类型转换,同样分成:
 *          自动类型转换
 *          强制类型转换
 *
 * @since 09:33
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo2 {
    public static void main(String[] args) {
        /*
            100是一个int类型,现在用long类型来接收,为什么没有报错呢？
            这就是基本数据类型的自动类型转换
            int --> long 是自动类型转换
          */
        long num = 100;

        int num2 = 123456789;
        // int --> float 取值范围小-->大 是自动类型转换
        float num3 = num2;
        System.out.println(num3);

        // 强转
        double num4 = 0.1;
        /*
            0.1是double类型,double --> float 取值范围是从大到小
            是强制类型转换
            所以需要特殊语法来完成
          */
        float num5 = (float) 0.1;
        // 强转的快捷键 ".cast"
        float num6 = (float) 0.1;

        // long --> int 强转
        long num7 = 100L;
        // 快捷键 alt + 回车
        int num8 = (int) num7;

        byte b1 = (byte) 200;
        System.out.println(b1);

        // 开发中基本数据类型的强转是比较少见的,偶尔见到一次,可能用于"取整"
        double d1 = 100.2;
        int result = (int) d1;
        System.out.println(result);
    }
}
